﻿#ifndef _IPV4_FRAG_H_
#define _IPV4_FRAG_H_

#include <stdint.h>
#include <stdbool.h>
#include "net_err.h"
#include "ipaddr.h"
#include "nlist.h"
#include "netif.h"
#include "ipv4.h"

// 数据包分片链表结构
typedef struct _ip_frag_t
{
    ipaddr_t ip;       // 发送分片数据包的ip地址
    uint16_t id;       // 分片数据包的id
    nlist_t buf_list;  // 存放分片数据包的链表
    nlist_node_t node; // 分片数据包链表也是以分片形式存放的
    int tmo;           // 链表超时时间
} ip_frag_t;

net_err_t ipfrag_init();
ip_frag_t *ipfrag_alloc(bool force);
void ipfrag_free(ip_frag_t *frag);
net_err_t ipfrag_in(netif_t *netif, pktbuf_t *buf, ipaddr_t *src_ip, ipaddr_t *dst_ip);
int ipfrag_get_start(ipv4_pkt_t *pkt);
int ipfrag_get_data(ipv4_pkt_t *pkt);
int ipfrag_get_end(ipv4_pkt_t *pkt);

#endif